﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Csla;
using System.ComponentModel.DataAnnotations;

namespace Sireass.Bl
{
    [Serializable]
    public class InformeEdit: BusinessBase<InformeEdit>
    {
        #region Propiedades
        public static readonly PropertyInfo<long> IdInformeProperty = RegisterProperty<long>(c => c.IdInforme);
        [Display(Name = "Id del Informe")]
        public long IdInforme
        {
            get { return GetProperty(IdInformeProperty); }
           private set { LoadProperty(IdInformeProperty, value); }
        }

        public static readonly PropertyInfo<long> IdAsignacionProperty = RegisterProperty<long>(c => c.IdAsignacion);
        [Display(Name = "Id de la asignación")]
        public long IdAsignacion
        {
            get { return GetProperty(IdAsignacionProperty); }
            set { SetProperty(IdAsignacionProperty, value); }
        }

        public static readonly PropertyInfo<byte> IdEstatusInformeProperty = RegisterProperty<byte>(c => c.IdEstatusInforme);
        [Display(Name = "Id del estatus del informe")]
        public byte IdEstatusInforme
        {
            get { return GetProperty(IdEstatusInformeProperty); }
            set { SetProperty(IdEstatusInformeProperty, value); }
        }

        public static readonly PropertyInfo<string> AportacionProperty = RegisterProperty<string>(c => c.Aportacion);
        [Display(Name = "Aportacion")]
        public string Aportacion
        {
            get { return GetProperty(AportacionProperty); }
            set { SetProperty(AportacionProperty, value); }
        }
        public static readonly PropertyInfo<string> PoblacionBeneficiadaProperty = RegisterProperty<string>(c => c.PoblacionBeneficiada);
        [Display(Name = "Poblacion beneficiada")]
        public string PoblacionBeneficiada
        {
            get { return GetProperty(PoblacionBeneficiadaProperty); }
            set { SetProperty(PoblacionBeneficiadaProperty, value); }
        }
        public static readonly PropertyInfo<string> ObservacionesProperty = RegisterProperty<string>(c => c.Observaciones);
        [Display(Name = "Observaciones")]
        public string Observaciones
        {
            get { return GetProperty(ObservacionesProperty); }
            set { SetProperty(ObservacionesProperty, value); }
        }

        public static readonly PropertyInfo<bool> HabilitadoProperty = RegisterProperty<bool>(c => c.Habilitado);
        [Display(Name = "Habilitado")]
        public bool Habilitado
        {
            get { return GetProperty(HabilitadoProperty); }
            set { SetProperty(HabilitadoProperty, value); }
        }
        public static readonly PropertyInfo<DateTime> FechaRegistroProperty = RegisterProperty<DateTime>(c => c.FechaRegistro);
        [Display(Name = "Fecha Registro")]
        public DateTime FechaRegistro
        {
            get { return GetProperty(FechaRegistroProperty); }
            set { SetProperty(FechaRegistroProperty, value); }
        }
        public static readonly PropertyInfo<DateTime> FechaActualizacionProperty = RegisterProperty<DateTime>(c => c.FechaActualizacion);
        [Display(Name = "Fecha Actualizacion")]
        public DateTime FechaActualizacion
        {
            get { return GetProperty(FechaActualizacionProperty); }
            set { SetProperty(FechaActualizacionProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaVoBoProperty = RegisterProperty<DateTime>(c => c.FechaVoBo);
        [Display(Name = "Fecha VoBo")]
        public DateTime FechaVoBo
        {
            get { return GetProperty(FechaVoBoProperty); }
            set { SetProperty(FechaVoBoProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaAutorizadoProperty = RegisterProperty<DateTime>(c => c.FechaAutorizado);
        [Display(Name = "Fecha Autorizado")]
        public DateTime FechaAutorizado
        {
            get { return GetProperty(FechaAutorizadoProperty); }
            set { SetProperty(FechaAutorizadoProperty, value); }
        }

        //public static readonly PropertyInfo<DateTime> FechaAltaProperty = RegisterProperty<DateTime>(c => c.FechaAlta);
        //[Display(Name = "Fecha Alta")]
        //public DateTime FechaAlta
        //{
        //    get { return GetProperty(FechaAltaProperty); }
        //    set { LoadProperty(FechaAltaProperty, value); }
        //}

        public static readonly PropertyInfo<DateTime> FechaBajaProperty = RegisterProperty<DateTime>(c => c.FechaBaja);
        [Display(Name = "Fecha Baja")]
        public DateTime FechaBaja
        {
            get { return GetProperty(FechaBajaProperty); }
            set { SetProperty(FechaBajaProperty, value); }
        }

        #endregion

        #region Factory
        public static void NewInformeEdit(EventHandler<DataPortalResult<InformeEdit>> callback)
        {
            DataPortal.BeginCreate<InformeEdit>(callback);
        }

        public static InformeEdit NewInformeEdit()
        {
            return DataPortal.Create<InformeEdit>();
        }

        public static void GetInformeEdit(long id, EventHandler<DataPortalResult<InformeEdit>> callback)
        {
            DataPortal.BeginFetch<InformeEdit>(id, callback);
        }

        public static InformeEdit GetInformeEdit(long id)
        {
            return DataPortal.Fetch<InformeEdit>(id);
        }

       
        #endregion

        #region Métodos
        public static void AddObjectAuthorizationRules()
        {
            Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
            PerfilServicioCriteria criteria = new PerfilServicioCriteria(type.FullName, true);
            PerfilServicioList perfilesPorServicio = PerfilServicioList.GetPerfilServicioList(criteria);
            List<string> roles = new List<string>(perfilesPorServicio.Count);
            foreach (PerfilServicioInfo perfilServicio in perfilesPorServicio)
            {
                roles.Add(perfilServicio.Perfil);
            }
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.CreateObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.EditObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.DeleteObject, roles));
        }

        #endregion


        #region DataPortal
        private void DataPortal_Fetch(long id)
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IInformeDal>();
                using (var data = new Csla.Data.SafeDataReader(dal.Fetch(id)))
                {
                    data.Read();
                    using (BypassPropertyChecks)
                    {
                        IdInforme = data.GetInt64("nId_Informe");
                        IdAsignacion = data.GetInt64("nId_Asignacion");
                        //IdEstatusInforme = data.GetByte("nld_Estatus_Informe");
                        Aportacion = data.GetString("cAportacion");
                        PoblacionBeneficiada = data.GetString("cPoblacionBeneficiada");
                        Observaciones = data.GetString("cObservaciones");
                        Habilitado = data.GetBoolean("bHabilitado");
                        FechaRegistro = data.GetDateTime("dFecha_Registro");
                        FechaActualizacion = data.GetDateTime("dFecha_Actualizacion");
                        FechaVoBo = data.GetDateTime("dFecha_VoBo");
                        FechaAutorizado = data.GetDateTime("dFecha_Autorizado");
                        FechaBaja = data.GetDateTime("dFecha_Baja");
                    }
                }
            }
          }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IInformeDal>();
                using (BypassPropertyChecks)
                {
                    IdInforme = dal.Insert(IdAsignacion, IdEstatusInforme, Aportacion, PoblacionBeneficiada,
                        Observaciones, Habilitado, FechaRegistro, FechaActualizacion, FechaVoBo, FechaAutorizado, FechaBaja);
                }
            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IInformeDal>();
                using (BypassPropertyChecks)
                {
                    dal.Update(IdInforme, IdAsignacion, IdEstatusInforme, Aportacion, PoblacionBeneficiada,
                        Observaciones, Habilitado, FechaRegistro, FechaActualizacion, FechaVoBo, FechaAutorizado, FechaBaja);
                }
            }
        }

        #endregion

    }
}
